#include <iostream>
#include <mutex>
#include <thread>

int shared_data = 0;
std::mutex mtx;

void add () {
    for (int i = 0; i < 100000; i++) {

        std::lock_guard<std::mutex> lg(mtx);  // lg(mtx, std::adopt_lock_t)  表示调用构造函数的时候不加锁
        // lock_guard用于在局部作用域中，自动加锁(lock_guard的构造函数调用时)和解锁(lock_guard的析构函数调用时)
        // lock_guard对象不能被复制或移动，只能在局部作用域中使用

        // lock_gurad里使用了explict，表示不支持隐式转换，就是说lock_guard<>里必须指定类型，不能像ArrayList那样不指定类型
        shared_data++;

        // 相当于下面的操作

        // mtx.lock();
        // shared_data++;
        // mtx.unlock();
    }
}

int main() {

    std::thread t1(add);
    std::thread t2(add);

    t1.join();
    t2.join();

    std::cout << "shared_data: " << shared_data << std::endl;

    return 0;
}